;----------------------------------------------------------------------------------------------------;
; FileName: src/boot/boot.asm
; Author: YSXCC
; CreateDate: 2020/12/12
; Describe: 引导程序,
;----------------------------------------------------------------------------------------------------;

%include "load.inc"

ORG 0x7C00                      ;偏移地址CS:IP=0000:7C00

BootStack     EQU	    0x7FFF  ;Boot区堆栈

entry:
    mov ax, cs                  ; 初始化代码段和数据段
    mov ds, ax
    mov es, ax
    mov	ss, ax
    mov sp, BootStack

    call clean_screen

    mov ax, LOADER_SEGMENT_ADDRESS
    mov dx, 0
    mov si, LOADER_LOGICAL_SECTOR
    mov cx, LOADER_SECTOR_COUNTS
    xor bx, bx
    
    call read_floppy_sector

    jmp LOADER_SEGMENT_ADDRESS:0

;----------------------------------------
;   清屏函数,设置显示模式可清屏80*25  16色
;   input:  no
;   output: no
;----------------------------------------
clean_screen:
	mov ax, 0x02
	int 0x10
    ret    

;----------------------------------------
;   读取软盘扇区
;   input:  
;         LOADER_SEGMENT_ADDRESS ---> ax
;         LOADER_LOGICAL_SECTOR  ---> si
;         LOADER_SECTOR_COUNTS   ---> cx
;   output:
;         no
;----------------------------------------
read_floppy_sector:
    push ax
    push bx
    push cx
    push dx
    push si
    push di
    push es

.read_one_settor:
    mov es, ax                  ;es设置int 0x13H的缓冲区段基址

    call .read

    add bx, 512
    inc si
    loop .read_one_settor      ;loop次数默认CX

    pop es
    pop di
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    ret

.read:
	push ax 
	push cx 
	push dx 
	push bx   
    
    mov ax, si      ;ax获取逻辑扇区号
    xor dx, dx      ;清空dx用于除法
    mov bx, 18      ;18是柱面(磁道)数
    div bx          ;除数为16位，被除数低16位在AX，高16位在DX,除数为16位，商在AX，余数在DX
    inc dx          ;相对扇区号是从1开始的

    mov cl, dl      ;相对扇区号
    xor dx, dx
    mov bx, 2       ;2是盘面(磁头)数
    div bx

    mov dh, dl      ;磁头号
    xor dl, dl
    mov ch, al      ;柱面号
    pop bx

.status_code_1:
    mov al, 0x01    ;要读取的扇区数
    mov ah, 0x02    ;入口参数
    int 0x13
    jc .status_code_1

    pop dx
	pop cx
	pop ax
    ret

times   510 - ($ - $$)    db 	0
db  0x55
db  0xAA